﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using E4RPTools;
using TakeAway.DataSet;

namespace TakeAway
{
    public class Database
    {
        private static long GetLastRequest(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction, int year)
        {
            const string query =
                @"  select  max(Numero)
                    from    Pedido
                    where   year(Emissao) = @Ano";
            return sqlDataAccess.ExecuteScalar(sqlTransaction, 0, query, new SqlParameter("Ano", year));
        }

        private static long GetRequestId(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction)
        {
            const string query =
                @"  select  max(Id)
                    from    Pedido";
            return sqlDataAccess.ExecuteScalar(sqlTransaction, -1, query);
        }

        private static void InsertRequest(SqlTransaction sqlTransaction, PedidoDataSet.PedidoRow request)
        {
            if (request.IsNumeroNull() || request.Numero < 0)
            {
                using (var sqlDataAccess = new SqlDataAccess())
                    request.Numero = GetLastRequest(sqlDataAccess, sqlTransaction, request.Emissao.Year) + 1;
            }
            if(request.Nome == "")
                request.Nome = request.Emissao.Year + " - " + request.Numero.ToString().PadLeft(6, '0');
            const string query =
                @"  insert 
                    into    Pedido(Numero, Nome, Emissao, Estado, TipoPagamento, Valor, ValorPago, TipoLocal,
                            NumeroCliente, NomeCliente, ContribuinteCliente, CidadeCliente, MoradaCliente, CodigoPostalCliente, ZonaCliente,
                            ObservacoesCliente, TelefoneCliente, Telemovel1Cliente, Telemovel2Cliente, Telemovel3Cliente, LojaCliente, EMail, Versao,
                            CriadoPor, CriadoEm, ActualizadoPor, ActualizadoEm) 
                    values  (@Numero, @Nome, @Emissao, @Estado, @TipoPagamento, @Valor, @ValorPago, @TipoLocal,
                            @NumeroCliente, @NomeCliente, @ContribuinteCliente, @CidadeCliente, @MoradaCliente, @CodigoPostalCliente, @ZonaCliente,
                            @ObservacoesCliente, @TelefoneCliente, @Telemovel1Cliente, @Telemovel2Cliente, @Telemovel3Cliente, @LojaCliente, @EMail, @Versao,
                            @CriadoPor, GetDate(), @ActualizadoPor, GetDate())";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("Numero", request.Numero),
                                        new SqlParameter("Nome", request.Nome),
                                        new SqlParameter("Emissao", request.Emissao),
                                        new SqlParameter("Estado", request.Estado),
                                        new SqlParameter("TipoPagamento", request.TipoPagamento),
                                        new SqlParameter("Valor", request.Valor),
                                        new SqlParameter("ValorPago", request.ValorPago),
                                        new SqlParameter("TipoLocal", request.TipoLocal),                                        
                                        new SqlParameter("NumeroCliente", request.Cliente),
                                        new SqlParameter("NomeCliente", request.ClienteNome),
                                        new SqlParameter("ContribuinteCliente", request.IsContribuinteNull() ? Convert.DBNull : request.Contribuinte),
                                        new SqlParameter("CidadeCliente", request.IsCidadeNull() ? Convert.DBNull : request.Cidade),
                                        new SqlParameter("MoradaCliente", request.IsMoradaNull() ? Convert.DBNull : request.Morada),
                                        new SqlParameter("CodigoPostalCliente", request.IsCodigoPostalNull() ? Convert.DBNull : request.CodigoPostal),
                                        new SqlParameter("ZonaCliente", request.Zona),
                                        new SqlParameter("ObservacoesCliente", request.IsPontoReferenciaNull() ? Convert.DBNull : request.PontoReferencia),
                                        new SqlParameter("TelefoneCliente", request.IsTelefoneNull() ? Convert.DBNull : request.Telefone),
                                        new SqlParameter("Telemovel1Cliente", request.IsTelemovel1Null() ? Convert.DBNull : request.Telemovel1),
                                        new SqlParameter("Telemovel2Cliente", request.IsTelemovel2Null() ? Convert.DBNull : request.Telemovel2),
                                        new SqlParameter("Telemovel3Cliente", request.IsTelemovel3Null() ? Convert.DBNull : request.Telemovel3),
                                        new SqlParameter("LojaCliente", request.Loja),
                                        new SqlParameter("EMail", request.IsEMailNull() ? Convert.DBNull : request.EMail),
                                        new SqlParameter("Versao", request.Versao),
                                        new SqlParameter("CriadoPor", request.CriadoPor),
                                        new SqlParameter("ActualizadoPor", request.ActualizadoPor)
                                    };
            using (var sqlDataAccess = new SqlDataAccess())
            {
                sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
                request.Id = GetRequestId(sqlDataAccess, sqlTransaction);
            }   
        }

        private static void UpdateRequest(SqlTransaction sqlTransaction, PedidoDataSet.PedidoRow request)
        {
            const string query =
                @"  update  Pedido
                    set     Estado = @Estado,
                            TipoPagamento = @TipoPagamento,
                            Valor = @Valor,
                            ValorPago = @ValorPago,
                            TipoLocal = @TipoLocal,
                            NumeroCliente = @NumeroCliente,
                            NomeCliente = @NomeCliente, 
                            ContribuinteCliente = @ContribuinteCliente,
                            ZonaCliente = @ZonaCliente,
                            ObservacoesCliente = @ObservacoesCliente,
                            TelefoneCliente = @TelefoneCliente,
                            Telemovel1Cliente = @Telemovel1Cliente,
                            Telemovel2Cliente = @Telemovel2Cliente,
                            Telemovel3Cliente = @Telemovel3Cliente,
                            LojaCliente = @LojaCliente,
                            EMail = @EMail,
                            IdExterno = @IdExterno,
		                    NumeroExterno = @NumeroExterno,
		                    UtilizadorExterno = @UtilizadorExterno, 
                            ActualizadoPor = @ActualizadoPor, 
                            ActualizadoEm = GetDate()
                    where   Id = @Id";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("Id", request.Id),
                                        new SqlParameter("Estado", request.Estado),
                                        new SqlParameter("TipoPagamento", request.TipoPagamento),
                                        new SqlParameter("Valor", request.Valor),
                                        new SqlParameter("ValorPago", request.ValorPago),
                                        new SqlParameter("TipoLocal", request.TipoLocal),                                        
                                        new SqlParameter("NumeroCliente", request.Cliente),
                                        new SqlParameter("NomeCliente", request.ClienteNome),
                                        new SqlParameter("ContribuinteCliente", request.IsContribuinteNull() ? Convert.DBNull : request.Contribuinte),
                                        new SqlParameter("CidadeCliente", request.IsCidadeNull() ? Convert.DBNull : request.Cidade),
                                        new SqlParameter("MoradaCliente", request.IsMoradaNull() ? Convert.DBNull : request.Morada),
                                        new SqlParameter("CodigoPostalCliente", request.IsCodigoPostalNull() ? Convert.DBNull : request.CodigoPostal),
                                        new SqlParameter("ZonaCliente", request.Zona),
                                        new SqlParameter("ObservacoesCliente", request.IsPontoReferenciaNull() ? Convert.DBNull : request.PontoReferencia),
                                        new SqlParameter("TelefoneCliente", request.IsTelefoneNull() ? Convert.DBNull : request.Telefone),
                                        new SqlParameter("Telemovel1Cliente", request.IsTelemovel1Null() ? Convert.DBNull : request.Telemovel1),
                                        new SqlParameter("Telemovel2Cliente", request.IsTelemovel2Null() ? Convert.DBNull : request.Telemovel2),
                                        new SqlParameter("Telemovel3Cliente", request.IsTelemovel3Null() ? Convert.DBNull : request.Telemovel3),
                                        new SqlParameter("LojaCliente", request.Loja),
                                        new SqlParameter("EMail", request.IsEMailNull() ? Convert.DBNull : request.EMail),
                                        new SqlParameter("IdExterno", request.IsExternoIdNull() ? Convert.DBNull : request.ExternoId),
                                        new SqlParameter("NumeroExterno", request.IsExternoNumeroNull() ? Convert.DBNull : request.ExternoNumero),
                                        new SqlParameter("UtilizadorExterno", request.IsExternoUtilizadorNull() ? Convert.DBNull : request.ExternoUtilizador),
                                        new SqlParameter("ActualizadoPor", request.ActualizadoPor)
                                    };
            using (var sqlDataAccess = new SqlDataAccess())
                sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
        }

        private static long GetRequestItemId(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction)
        {
            const string query =
                @"  select  max(IdItem)
                    from    ItemPedido";
            return sqlDataAccess.ExecuteScalar(sqlTransaction, -1, query);
        }

        private static void InsertRequestItem(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction, PedidoDataSet.ItemPedidoRow requestItem)
        {
            const string query =
                @"  insert 
                    into    ItemPedido(Id, Familia, ReferenciaProduto, NomeProduto, Quantidade, PrecoTabela, Valor, ValorTotal, PercentagemIva, Stock, Observacoes) 
                    values  (@Id, @Familia, @ReferenciaProduto, @NomeProduto, @Quantidade, @PrecoTabela, @Valor, @ValorTotal, @PercentagemIva, @Stock, @Observacoes)";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("Id", requestItem.PedidoRow.Id),
                                        new SqlParameter("Familia", requestItem.IsFamiliaNull()? Convert.DBNull : requestItem.Familia),
                                        new SqlParameter("ReferenciaProduto", requestItem.ReferenciaProduto),
                                        new SqlParameter("NomeProduto", requestItem.NomeProduto),
                                        new SqlParameter("Quantidade", requestItem.Quantidade),
                                        new SqlParameter("PrecoTabela", requestItem.IsPrecoTabelaNull() ? Convert.DBNull : requestItem.PrecoTabela),
                                        new SqlParameter("Valor", requestItem.Valor),
                                        new SqlParameter("ValorTotal", requestItem.ValorTotal),
                                        new SqlParameter("PercentagemIva", requestItem.PercentagemIva),
                                        new SqlParameter("Stock", requestItem.Stock),                                        
                                        new SqlParameter("Observacoes", requestItem.IsObservacoesNull() ? Convert.DBNull : requestItem.Observacoes)
                                    };
            sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
            requestItem.IdItem = GetRequestItemId(sqlDataAccess, sqlTransaction);
        }

        private static void UpdateRequestItem(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction, PedidoDataSet.ItemPedidoRow requestItem)
        {
            const string query =
                @"  update  ItemPedido
                    set     Familia = @Familia,
                            ReferenciaProduto = @ReferenciaProduto,
                            NomeProduto = @NomeProduto,
                            Quantidade = @Quantidade,
                            PrecoTabela = @PrecoTabela,
                            Valor = @Valor,
                            ValorTotal = @ValorTotal,
                            PercentagemIva = @PercentagemIva,
                            Stock = @Stock,                            
                            Observacoes = @Observacoes
                    where   IdItem = @IdItem";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("IdItem", requestItem.IdItem),
                                        new SqlParameter("Familia", requestItem.IsFamiliaNull()? Convert.DBNull : requestItem.Familia),
                                        new SqlParameter("ReferenciaProduto", requestItem.ReferenciaProduto),
                                        new SqlParameter("NomeProduto", requestItem.NomeProduto),
                                        new SqlParameter("Quantidade", requestItem.Quantidade),
                                        new SqlParameter("PrecoTabela", requestItem.IsPrecoTabelaNull() ? Convert.DBNull : requestItem.PrecoTabela),
                                        new SqlParameter("Valor", requestItem.Valor),
                                        new SqlParameter("ValorTotal", requestItem.ValorTotal),
                                        new SqlParameter("PercentagemIva", requestItem.PercentagemIva),
                                        new SqlParameter("Stock", requestItem.Stock),                                        
                                        new SqlParameter("Observacoes", requestItem.IsObservacoesNull() ? Convert.DBNull : requestItem.Observacoes)
                                    };
            sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
        }

        private static void DeleteRequestItem(SqlDataAccess sqlDataAccess, SqlTransaction sqlTransaction, DataRow requestItem)
        {
            const string query =
                @"  delete  ItemPedido
                    where   IdItem = @IdItem";
            var requestItemId = Convert.ToInt64(requestItem["IdItem", DataRowVersion.Original]);
            sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, new SqlParameter("IdItem", requestItemId));
        }

        private static string BuildStringFilter(IEnumerable<RequestState> states)
        {
            string filter = "";
            foreach(RequestState state in states)
            {
                if (filter != "") filter += ",";
                filter += "'" + state + "'";
            }
            return filter;
        }



        public static PedidoDataSet GetRequestsByState(SqlTransaction sqlTransaction, List<RequestState> states, string shop, DateTime beginDate, DateTime endDate)
        {
            var dataSet = new PedidoDataSet();
            const string requestQuery =
                @"  select	Id,
		                    Numero,
		                    Nome,
		                    Emissao,
		                    Estado,
		                    NumeroCliente as Cliente,
		                    NomeFuncionario as Funcionario,
		                    TipoPagamento,
		                    IdExterno as ExternoId,
		                    NumeroExterno as ExternoNumero,
		                    UtilizadorExterno as ExternoUtilizador,	
		                    Valor,
		                    ValorPago,
		                    Atribuido,
		                    MoradaCliente as Morada,
		                    CodigoPostalCliente as CodigoPostal,
		                    CidadeCliente as Cidade,
		                    ZonaCliente as Zona,
		                    ObservacoesCliente as PontoReferencia,
		                    TipoLocal,
		                    ContribuinteCliente as Contribuinte,
		                    NomeCliente as ClienteNome,
		                    TelefoneCliente as Telefone,
		                    Telemovel1Cliente as Telemovel1,
		                    Telemovel2Cliente as Telemovel2,
		                    Telemovel3Cliente as Telemovel3,
		                    LojaCliente as Loja,
                            EMail,
                            Versao,
                            CriadoPor, CriadoEm, ActualizadoPor, ActualizadoEm
                    from    Pedido
                    where   Estado in ({0})
                            and ((LojaCliente = @Loja and Estado != 'Novo') or @Loja = '')
                            and convert( datetime, convert(varchar, Emissao, 104), 104) between @DataInicio and @DataFim ";
            const string requestItemQuery =
                @"  select  p.Id, IdItem, Familia, ReferenciaProduto, NomeProduto, Quantidade, PrecoTabela, i.Valor, ValorTotal, PercentagemIva, Stock, Observacoes
                    from    Pedido p, ItemPedido i
                    where   p.Estado in ({0})
                            and i.Id = p.Id
                            and ((LojaCliente = @Loja and Estado != 'Novo') or @Loja = '')
                            and convert( datetime, convert(varchar, Emissao, 104), 104) between @DataInicio and @DataFim";
            string stateFilter = BuildStringFilter(states);
            using (var dataAccess = new SqlDataAccess())
            {
                dataAccess.Fill(sqlTransaction, dataSet.Pedido, string.Format(requestQuery, stateFilter),
                                new SqlParameter("DataInicio", beginDate.Date),
                                new SqlParameter("DataFim", endDate.Date),
                                new SqlParameter("Loja", shop));
                dataAccess.Fill(sqlTransaction, dataSet.ItemPedido, string.Format(requestItemQuery, stateFilter),
                                new SqlParameter("DataInicio", beginDate.Date),
                                new SqlParameter("DataFim", endDate.Date),
                                new SqlParameter("Loja", shop));
            }
            return dataSet;
        }

        public static PedidoDataSet GetRequest(SqlTransaction sqlTransaction, long requestId)
        {
            var dataSet = new PedidoDataSet();
            const string requestQuery =
                @"  select	Id,
		                    Numero,
		                    Nome,
		                    Emissao,
		                    Estado,
		                    NumeroCliente as Cliente,
		                    NomeFuncionario as Funcionario,
		                    TipoPagamento,
		                    IdExterno as ExternoId,
		                    NumeroExterno as ExternoNumero,
		                    UtilizadorExterno as ExternoUtilizador,	
		                    Valor,
		                    ValorPago,
		                    Atribuido,
		                    MoradaCliente as Morada,
		                    CodigoPostalCliente as CodigoPostal,
		                    CidadeCliente as Cidade,
		                    ZonaCliente as Zona,
		                    ObservacoesCliente as PontoReferencia,
		                    TipoLocal,
		                    ContribuinteCliente as Contribuinte,
		                    NomeCliente as ClienteNome,
		                    TelefoneCliente as Telefone,
		                    Telemovel1Cliente as Telemovel1,
		                    Telemovel2Cliente as Telemovel2,
		                    Telemovel3Cliente as Telemovel3,
		                    LojaCliente as Loja,
                            EMail,
                            Versao,
                            CriadoPor, CriadoEm, ActualizadoPor, ActualizadoEm
                    from    Pedido
                    where   Id = @Id";
            const string requestItemQuery =
                @"  select  Id, IdItem, Familia, ReferenciaProduto, NomeProduto, Quantidade, PrecoTabela, Valor, ValorTotal, PercentagemIva, Stock, Observacoes
                    from    ItemPedido
                    where   Id = @Id";
	        using (var dataAccess = new SqlDataAccess())
            {
                dataAccess.Fill(sqlTransaction, dataSet.Pedido, requestQuery, new SqlParameter("Id", requestId));
                dataAccess.Fill(sqlTransaction, dataSet.ItemPedido, requestItemQuery, new SqlParameter("Id", requestId));                
            }
            return dataSet;
        }

        public static void SaveRequest(SqlTransaction sqlTransaction, PedidoDataSet.PedidoRow request)
        {
            if (request.RowState == DataRowState.Added)
                InsertRequest(sqlTransaction, request);
            else
                UpdateRequest(sqlTransaction, request);
        }

        public static void UpdateRequestItems(SqlTransaction sqlTransaction, PedidoDataSet.ItemPedidoDataTable requestItems)
        {
            using (var sqlDataAccess = new SqlDataAccess())
            {
                foreach (PedidoDataSet.ItemPedidoRow requestItem in requestItems)
                {
                    switch (requestItem.RowState)
                    {
                        case DataRowState.Added:
                            InsertRequestItem(sqlDataAccess, sqlTransaction, requestItem);
                            break;
                        case DataRowState.Modified:
                            UpdateRequestItem(sqlDataAccess, sqlTransaction, requestItem);
                            break;
                        case DataRowState.Deleted:
                            DeleteRequestItem(sqlDataAccess, sqlTransaction, requestItem);
                            break;
                    }
                }
            }
        }

        public static void UpdateRequestState(SqlTransaction sqlTransaction, long requestId, string state, string updatedBy)
        {
            const string query =
                @"  update  Pedido
                    set     Estado = @Estado, 
                            ActualizadoPor = @ActualizadoPor, 
                            ActualizadoEm = GetDate()
                    where   Id = @Id";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("Id", requestId),
                                        new SqlParameter("Estado", state),
                                        new SqlParameter("ActualizadoPor", updatedBy)
                                    };
            using (var sqlDataAccess = new SqlDataAccess())
                sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
        }

        public static FuncionarioDataSet GetAssignedEmployees(SqlTransaction sqlTransaction, string shop)
        {
            var dataSet = new FuncionarioDataSet();
            const string query =
                @"  select	distinct NomeFuncionario as Nome
                    from    Pedido
                    where   (LojaCliente = @Shop or @Shop = '')
                            and NomeFuncionario is not null
                            and Estado not in ('Cancelado', 'Fechado', 'Substituido')
                            and Year(Emissao) = @Ano
                            and Month(Emissao) = @Mes
                            and Day(Emissao) = @Dia";
            using (var dataAccess = new SqlDataAccess())
                dataAccess.Fill(sqlTransaction, dataSet.Funcionario, query, new SqlParameter("Shop", shop), new SqlParameter("Ano", DateTime.Today.Year),
                                new SqlParameter("Mes", DateTime.Today.Month), new SqlParameter("Dia", DateTime.Today.Day));
            return dataSet;
        }

        public static void AssignEmployee(SqlTransaction sqlTransaction, long requestId, string employeeName, DateTime? assigned, string updatedBy)
        {
            const string query =
                @"  update  Pedido
                    set     NomeFuncionario = @NomeFuncionario,
                            Atribuido = @Atribuido, 
                            ActualizadoPor = @ActualizadoPor, 
                            ActualizadoEm = GetDate()
                    where   Id = @Id";
            var sqlParameters = new List<SqlParameter>
                                    {
                                        new SqlParameter("Id", requestId),
                                        new SqlParameter("NomeFuncionario", employeeName == "" ? Convert.DBNull : employeeName),
                                        new SqlParameter("Atribuido", !assigned.HasValue ? Convert.DBNull : assigned.Value),
                                        new SqlParameter("ActualizadoPor", updatedBy)
                                    };
            using (var sqlDataAccess = new SqlDataAccess())
                sqlDataAccess.ExecuteNonQuery(sqlTransaction, query, sqlParameters.ToArray());
        }

        public static ImpressaoDataSet GetPrint(SqlTransaction sqlTransaction, long requestId)
        {
            var dataSet = new ImpressaoDataSet();
            const string requestQuery =
                @"  select	Id,
		                    Numero,
		                    Nome,
		                    Emissao,
		                    NomeFuncionario as Funcionario,
		                    Valor as ValorAPagar,
                            ValorPago - Valor as ValorTroco,
		                    ValorPago,
		                    TipoPagamento,
                            NomeCliente as Cliente,
		                    MoradaCliente as Morada,
		                    CidadeCliente as Cidade,
		                    CodigoPostalCliente as CodigoPostal,
		                    ZonaCliente as Zona,
		                    ObservacoesCliente as Observacoes,
		                    ContribuinteCliente as Contribuinte,		                    
		                    TelefoneCliente as Telefone,
		                    Telemovel1Cliente as Telemovel1,
		                    Telemovel2Cliente as Telemovel2,
		                    Telemovel3Cliente as Telemovel3,
		                    UtilizadorExterno as Utilizador,
                            LojaCliente as Loja,
                            NumeroExterno as ExternoNumero
                    from    Pedido
                    where   Id = @Id";
            const string familyRequestItemQuery =
                @"  select	Id, IdItem, Familia
                    from    ItemPedido
                    where   Id = @Id";
            const string requestItemQuery =
                @"  select	IdItem, Familia, Quantidade,  NomeProduto as Produto, PercentagemIva, 
                            ValorTotal as Valor, 
                            (Quantidade * PrecoTabela) as PrecoTabela, 
                            Observacoes
                    from    ItemPedido
                    where   Id = @Id";
            const string shopQuery =
                @"  select	Nome, Morada, CodigoPostal, Contribuinte, Telefone, Fax
                    from    Loja
                    where   Id = @Shop";
	        using (var dataAccess = new SqlDataAccess())
            {
                dataAccess.Fill(sqlTransaction, dataSet.Pedido, requestQuery, new SqlParameter("Id", requestId));
                if(dataSet.Pedido.Count == 0)
                    return dataSet;
                dataSet.Pedido[0].HoraEntrega = dataSet.Pedido[0].Emissao.AddHours(1);
                dataAccess.Fill(sqlTransaction, dataSet.FamiliaItemPedido, familyRequestItemQuery, new SqlParameter("Id", requestId));                
                dataAccess.Fill(sqlTransaction, dataSet.ItemPedido, requestItemQuery, new SqlParameter("Id", requestId));
                dataAccess.Fill(sqlTransaction, dataSet.Loja, shopQuery, new SqlParameter("Shop", dataSet.Pedido[0].Loja));
            }
            return dataSet;
        }

        public static LojaDataSet GetShops(SqlTransaction sqlTransaction)
        {
            var dataSet = new LojaDataSet();            
            const string query =
                @"  select	Id
                    from    Loja";
            using (var dataAccess = new SqlDataAccess())
                dataAccess.Fill(sqlTransaction, dataSet.Loja, query);
            return dataSet;
        }        
    }
}
